package com.xuetang9.controller.a.task;

import com.xuetang9.domain.Task;
import com.xuetang9.dto.InputDto;
import com.xuetang9.dto.a.*;
import com.xuetang9.service.TaskService;
import com.xuetang9.vo.JsonResultVO;
import com.xuetang9.vo.ListVO;
import com.xuetang9.vo.a.ConfirmDefectVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * @工能 任务模块请求页面
 * @作者 杜目杰
 * @时间 2020/5/15
 * @地点 公司
 * @版本 1.0.0
 * @版权 老九学堂
 */
@Controller
@CrossOrigin
@ResponseBody
public class TaskController {
    /**
     * 任务业务处理对象
     */
    @Autowired
    TaskService taskService;

    /**
     * 处理取消任务请求
     * @param id 任务id
     * @return 前端显示对象
     */
    @GetMapping("/polling/cancel")
    public JsonResultVO taskCancel(int id) {
        JsonResultVO vo = new JsonResultVO();
        if (id == 0) {
            vo.setCode(500);
            vo.setMessage("未得到任务编号");
            return vo;
        }

        int result = 0;
        try {
            result = taskService.deleteTask(id);
        } catch (Exception e) {
            vo.setCode(500);
            vo.setMessage("取消失败");
        }
        if (result < 0) {
            vo.setCode(500);
            vo.setMessage("取消失败");
        }
        vo.setCode(200);
        vo.setMessage("已取消");
        return vo;
    }

    /**
     * 处理任务修改请求
     * @param task 新的任务内容
     * @return 前端显示
     */
    @PostMapping("/circuit/update")
    public JsonResultVO updateTask(@RequestBody Task task){
        JsonResultVO vo = new JsonResultVO();
        if (task == null){
            vo.setCode(500);
            vo.setMessage("请求数据为空");
        }
        if (task.getId() == 0) {
            vo.setCode(500);
            vo.setMessage("未得到任务编号");
            return vo;
        }
        int result = 0;
        try{
            result = taskService.update(task);
        }catch (Exception e){
            vo.setCode(500);
            vo.setMessage("修改失败");
            return vo;
        }
        if (result < 0){
            vo.setCode(500);
            vo.setMessage("修改失败");
            return vo;
        }
        vo.setCode(200);
        vo.setMessage("修改成功");
        return vo;
    }
    /**
     * 新增任务请求
     *
     * @param dto 任务新增请求参数
     * @return 前端显示对象
     */
    @PostMapping("/polling/enact")
    public JsonResultVO insertTask(@RequestBody AddInspectionTaskDTO dto) {
        return pollingUpdate("制定巡检任务", dto);
    }

    /**
     * 任务分配
     * @param dto 任务新增请求参数
     * @return 前端显示对象
     */
    @PostMapping("/polling/taskAllocation")
    public JsonResultVO taskAllocation(@RequestBody TaskAllocationDTO dto) {
        return pollingUpdate("任务分配", dto);
    }

    /**
     * 封装重复的代码
     * @param function 业务名称
     * @param data 请求数据
     * @return 前端显示对象
     */
    private JsonResultVO pollingUpdate(String function, Object data) {
        JsonResultVO<Integer> jsonResultVO = new JsonResultVO<>();
        // 保存执行添加的结果
        int result;
        // 传入为空直接返回空防止资源浪费
        if (data == null) {
            jsonResultVO.setCode(500);
            jsonResultVO.setMessage("数据为空");
            return jsonResultVO;
        }

        // 配置数据输入对象
        InputDto inputDto = new InputDto();
        inputDto.function = function;

        // 执行业务并返回结果
        try {
            if ("制定巡检任务".equals(function)) {
                inputDto.date = (AddInspectionTaskDTO) data;
                result = taskService.insertTask(inputDto);
            } else if ("任务分配".equals(function)) {
                inputDto.date = (TaskAllocationDTO) data;
                result = taskService.updateTask(inputDto);
            } else {
                jsonResultVO.setMessage("执行的操作与请求数据不匹配");
                jsonResultVO.setCode(500);
                return jsonResultVO;
            }

        } catch (Exception e) {
            jsonResultVO.setMessage("添加失败");
            jsonResultVO.setCode(500);
            jsonResultVO.setData(0);
            return jsonResultVO;
        }
        jsonResultVO.setData(1);
        jsonResultVO.setCode(200);
        jsonResultVO.setMessage("添加成功");
        return jsonResultVO;
    }

    /**
     * 处理缺陷管理模块的显示列表查询
     *
     * @param listRequestDTO 用户查询请求参数
     * @return 前端用户查询显示类容
     */
    @PostMapping("/polling/query")
    public JsonResultVO listUser(@RequestBody ListRequestDTO<InspectionTasksDTO> listRequestDTO) {
        JsonResultVO<ListVO> jsonResultVO = new JsonResultVO<>();
        // 用来保存需要返回的数据
        ListVO listUserVO = null;
        // 传入为空直接返回空防止资源浪费
        if (listRequestDTO == null) {
            jsonResultVO.setCode(500);
            jsonResultVO.setMessage("没有数据");
            return jsonResultVO;
        }
        String fuction = "查询";
        return pollingQuery(fuction, listRequestDTO);
    }

    /**
     * 处理缺陷管理模块的显示列表查询
     *
     * @param listRequestDTO 用户查询请求参数
     * @return 前端用户查询显示类容
     */
    @PostMapping("/polling/selectTaskDetail")
    public JsonResultVO selectTaskDetail(@RequestBody ListRequestDTO<SelectTaskDetailsDTO> listRequestDTO) {
        JsonResultVO<ListVO> jsonResultVO = new JsonResultVO<>();
        // 用来保存需要返回的数据
        ListVO listUserVO = null;
        // 传入为空直接返回空防止资源浪费
        if (listRequestDTO == null) {
            jsonResultVO.setCode(500);
            jsonResultVO.setMessage("没有数据");
            return jsonResultVO;
        }
        String fuction = "查询任务进度";
        return pollingQuery(fuction, listRequestDTO);
    }

    private JsonResultVO pollingQuery(String fuction, Object data) {
        JsonResultVO<ListVO> jsonResultVO = new JsonResultVO<>();
        // 用来保存需要返回的数据
        ListVO listUserVO = null;
        // 传入为空直接返回空防止资源浪费

        // 创建业务执行输入对象
        InputDto inputDto = new InputDto();
        inputDto.function = fuction;
        if ("查询".equals(fuction)) {
            inputDto.date = (ListRequestDTO<InspectionTasksDTO>) data;
        } else if ("查询任务进度".equals(fuction)) {
            inputDto.date = (ListRequestDTO<SelectTaskDetailsDTO>) data;
        } else {
            jsonResultVO.setMessage("查询的内容与请求数据不匹配");
            jsonResultVO.setCode(500);
            return jsonResultVO;
        }

        // 得到显示数据
        try {
            listUserVO = taskService.selectTask(inputDto);
        } catch (Exception e) {
            jsonResultVO.setMessage("查询失败");
            jsonResultVO.setCode(500);
        }
        //将显示数据放入返回前端的请求返回对象中
        jsonResultVO.setData(listUserVO);
        jsonResultVO.setCode(200);
        return jsonResultVO;
    }
}
